package cn.swing.his.operation.service;

import cn.swing.his.common.web.JsonPage;
import cn.swing.his.pojo.affair.vo.MedicineDetailsVO;
import cn.swing.his.pojo.operation.dto.OrderSettingDTO;
import cn.swing.his.pojo.operation.dto.PatientSimpleInfoDTO;
import cn.swing.his.pojo.operation.vo.*;
import cn.swing.his.pojo.user.vo.MedicalRecordVO;
import cn.swing.his.pojo.operation.dto.PatientCheckItemDTO;
import cn.swing.his.pojo.operation.vo.OrderSettingVO;
import cn.swing.his.pojo.operation.vo.PatientSimpleInfoVO;
import cn.swing.his.pojo.operation.vo.SearchOrderVO;

import java.text.ParseException;
import java.util.List;
import java.util.Map;

public interface IOperationService {
    /**********************************  insert   *********************************/

    /**
     * 插入预约信息
     * @param orderSettingDTO 简单信息
     * @return 受影响行数
     */
    int insertOrderSetting(OrderSettingDTO orderSettingDTO);
    /**
     * 增加一个处方表-药品购买表
     * @param
     * @return 受影响的行数
     */
    void insertPrescriptionMedicine(PrescriptionMedicineVO prescriptionMedicineVO);

    /**
     * 增加一个处方表
     * @param
     * @return 受影响的行数
     */
    int insertPrescription(PrescriptionVO prescriptionVO);

    /**
     * 根据医生提供的表单为患者安排检查
     * @param patientCheckItemDTO 患者的检查项
     * @return 受影响的行数
     */
    int insertCheckForPatient(PatientCheckItemDTO patientCheckItemDTO);

    /**
     * 插入患者信息
     * @param simpleInfoDTO 患者基本信息
     * @return 患者信息
     */
    PatientSimpleInfoVO insertPatientInfo(PatientSimpleInfoDTO simpleInfoDTO);

    /**********************************  delete   *********************************/
    /**
     * 通过id删除预约信息
     * @param id 预约的id
     * @return  受影响行数
     */
    int deleteOrderSettingById(Integer id);

    /**
     *通过id 删除患者信息
     * @param id 患者id
     * @return 受影响行数
     */
    int deletePatientInfoById(Integer id);

    /**********************************  update   *********************************/

    /**
     * 收费时根据处方表id修改患者缴费状态
     * @param id 处方单id
     * @return 受影响的行数
     */
    void updatePrescriptionStateById(Integer id);

    /**
     * 根据患者id修改患者信息并返回患者基本信息
     * @param simpleInfoDTO 患者基本信息
     * @return 患者基本信息
     */
    PatientSimpleInfoVO updatePatientInfoByIdCard(PatientSimpleInfoDTO simpleInfoDTO);

    /**
     * 根据预约表的id修改预约状态(就诊中)
     * @param  id 预约表id
     * @return 受影响行数
     */
    int updateOrderSettingStateToSeeing(Integer id);

    /**
     * 通过id 修改患者信息
     * @param patientInfoVO 要修改的信息
     * @return 受影响行数
     */
    int updatePatientInfoById(PatientInfoVO patientInfoVO);
    /**********************************  select   *********************************/

    /**
     * 根据医生的id查询预约该医生的预约信息
     * @param searchOrderVO 搜索条件
     * @return  预约信息
     */
    JsonPage<OrderSettingVO> getOrderSettingByDoctorId(SearchOrderVO searchOrderVO);

    /**
     * 根据医生的id查询该医生的排班信息
     * @param doctorId 医生id
     * @param pageNum 页号
     * @param pageSize 每页大小
     * @return 所有排班信息
     */
    JsonPage<SchedulingVO> getSchedulingByDoctorId(Integer pageNum, Integer pageSize, Integer doctorId);

    /**
     * 根据患者身份证查询患者病历
     * @param idCard 患者身份证
     * @param pageNum 页号
     * @param pageSize 每页大小
     * @return 病历单
     */
    JsonPage<MedicalRecordVO> getMedicalRecordByIdCard(Integer pageNum, Integer pageSize, String idCard);

    /**
     * 根据就诊卡号查询患者历史患病信息
     * @param id 就诊卡号
     * @return 历史患病信息
     */
    List<PersonalSickRecordVO> getPatientSickRecordById(Integer id);

    /**
     * 根据患者就诊卡号查询基本信息
     * @param patientId 就诊卡号
     * @return 患者简单信息
     */
    PatientSimpleInfoVO getPatientInfoByPatientId(Integer patientId);

    /**
     * 根据患者身份证查询基本信息
     * @param idCard 身份证id
     * @return 患者简单信息
     */
    PatientSimpleInfoVO getPatientInfoByIdCard(String idCard);

    /**
     * 查询所有科室信息
     * @return 科室列表
     */
    List<RoomVO> getRoomSimpleInfo();

    /**
     * 根据科室查询医生信息
     * @param roomId 科室id
     * @return 医生列表
     */
    List<DoctorSimpleVO> getDoctorListByRoomId(Integer roomId);

    /**
     * 查询当天预约人数
     * @return 人数
     */
    int getOrderSettingCount();

    /**
     * 查询就诊人数
     * @return 人数
     */
    int getFinishOrderSettingCount();

    /**
     * 根据时间查询近一个月各门诊的预约人数
     * @return 对应的数
     */
    List<OrderSettingServiceVO> getOrderSettingServiceCount();

    /**
     * 查询近七天或昨天的就诊人数
     * @param time 1 or 7
     * @return map
     */
    List<Map<String, String>> getCountOfNearlySevenDayOrYesterday(Integer time);

    /**
     * 查询将要过期的药(30天)
     * @return 将要过期的药
     */
    List<MedicineSimpleVO> getMedicineThatWillExpire();

    /**
     * 查询数量少的药(少于10)
     * @return 少于10的药
     */
    List<MedicineSimpleVO> getMedicineThatLessNumbers();

    /**
     * 根据科室id查询所有医生
     * @param roomId 科室id
     * @return 所有医生
     */
    List<DoctorDetailVo> getDoctorDetailByRoomId(Integer roomId);

    /**
     * 根据电话号码查询患者
     * @param number 电话号码
     * @return 患者信息
     */
    List<PatientInfoVO> getPatientByTelephone(String number);

    /**
     * 根据电话号码查询预约信息
     * @param telephone 电话号码
     * @return 患者预约信息
     */
    List<OrderSettingVO> getOrderSettingVOByTelephone(String telephone);

    /**
     * 根据电话查询患者病史
     * @param telephone 电话号码
     * @return 患者病历
     */
    List<MedicalHistoryVO> getMedicalHistoryByTelephone(String telephone);


    /**
     * 根据电话查询患者就诊报告
     * @param telephone 电话
     * @return 就诊报告
     */
    List<MedicalReportVO> getMedicalReportByTelephone(String telephone);

    /**
     * 根据id查询患者信息(传参使用)
     * @param id 患者id
     * @return 患者信息
     */
    PatientVO getPatientInfoById(Integer id);


    /**
     * 查询所有药品信息
     * @return 所有药品
     */
    List<MedicineDetailsVO> getMedicineList();

    /**
     * 根据关键字查询药品信息
     * @param name 药品名
     * @return 符合条件的药品
     */
    List<MedicineDetailsVO> getMedicineListByName(String name);

}
